昨天介紹Pandas的資料操作,當index沒有對應到的時候會出現NaN,今天要來介紹Pandas中如果資料是空值(或者沒有)時可以採取的資料型態。昨天也介紹Pandas資料型態和Numpy不同的是會有index,可是昨天示範都只有單一的index,今天的內容一部分也會講MultiIndex。
今天學習得的重點
import numpy as np
import pandas as pd
ironman = np.array([1,None,3,4])
ironman
# 輸出結果
array([1, None, 3, 4], dtype=object)
None在數值運算中會出現錯誤,ex: sum(),min(),因此出現了NaN這樣的數值缺失資料型態
ironman = np.array([1,np.nan,3,4])
ironman.dtype
# 輸出結果
dtype('float64')
使用NaN進行數值運算
sum()改成用nansum(), min()改成用nanmin(), max()改成用nanmax()
np.nansum(ironman),np.nanmin(ironman),np.nanmax(ironman)
# 輸出結果
(8.0, 1.0, 4.0)
isnull():檢查空值,回傳布林值
notnull():檢查不是空值,回傳布林值
dropna():刪除空值
fillna():填入空值
ironman = pd.Series([1,np.nan,3,4,None])
ironman.isnull()
#輸出結果
0 False
1 True
2 False
3 False
4 True
dtype: bool
notnull和遮罩一起的應用,取出陣列中不是空值的部分
ironman[ironman.notnull()]
# 輸出結果
0 1.0
2 3.0
3 4.0
dtype: float64
示範刪除DataFrame空值,會直接刪除整欄和整列
ironman = pd.DataFrame([
[1,np.nan,3],
[4,5,6],
[7,8,np.nan]])
ironman.dropna()
# 輸出結果
0 1 2
1 4 5.0 6.0
示範將null填入0
ironman = pd.Series([1,np.nan,3,4,None])
ironman.fillna(0)
# 輸出結果
0 1.0
1 0.0
2 3.0
3 4.0
4 0.0
dtype: float64
index = [('Taichung',2018),('Taichung',2017),
('Changhua',2018),('Changhua',2017),
('Taipei',2018),('Taipei',2017),
('Kaohsiung',2018),('Kaohsiung',2017)]
index = pd.MultiIndex.from_tuples(index)
index
# 輸出結果
MultiIndex(levels=[['Changhua', 'Kaohsiung', 'Taichung', 'Taipei'], [2017, 2018]],
labels=[[2, 2, 0, 0, 3, 3, 1, 1], [1, 0, 1, 0, 1, 0, 1, 0]])
elementary = [
800,780,
620,580,
1500,1350,
1100,998
]
ironman = pd.Series(elementary, index=index)
ironman
# 輸出結果
Taichung 2018 800
2017 780
Changhua 2018 620
2017 580
Taipei 2018 1500
2017 1350
Kaohsiung 2018 1100
2017 998
dtype: int64
用MultiIndex取得資料,所有2017年國小數
ironman[:,2017]
#輸出結果
Taichung 780
Changhua 580
Taipei 1350
Kaohsiung 998
dtype: int64
其他取得資料的方式
ironman[ironman > 600] #遮罩
ironman[['Changhua','Kaohsiung']] #fancy索引
ironman_unstack = ironman.unstack()
ironman_unstack
# 輸出結果
2017 2018
Changhua 580 620
Kaohsiung 998 1100
Taichung 780 800
Taipei 1350 1500
ironman.index.names = ['area','year']
ironman
# 輸出結果
area year
Taichung 2018 800
2017 780
Changhua 2018 620
2017 580
Taipei 2018 1500
2017 1350
Kaohsiung 2018 1100
2017 998
dtype: int64
ironmanIndex = pd.MultiIndex.from_product([[2017, 2016, 2018], [1, 2]],names=['year','enroll'])
ironmanColumns = pd.MultiIndex.from_product([['azure','ai&data','web'], ['自我挑戰組', '主題競賽']],names=['subject','type'])
number = np.random.randint(50, size=(6,6))
ironmanNumber = pd.DataFrame(number, index = ironmanIndex, columns=ironmanColumns )
ironmanNumber
# 輸出結果
subject azure ai&data web
type 自我挑戰組 主題競賽 自我挑戰組 主題競賽 自我挑戰組 主題競賽
year enroll
2017 1 44 6 6 33 29 6
2 3 24 14 7 9 0
2016 1 45 18 10 36 43 27
2 42 23 44 21 17 34
2018 1 29 22 42 29 4 12
2 6 5 31 9 48 4
ironmanNumber.sort_index()
# 輸出結果
subject azure ai&data web
type 自我挑戰組 主題競賽 自我挑戰組 主題競賽 自我挑戰組 主題競賽
year enroll
2016 1 45 18 10 36 43 27
2 42 23 44 21 17 34
2017 1 44 6 6 33 29 6
2 3 24 14 7 9 0
2018 1 29 22 42 29 4 12
2 6 5 31 9 48 4
*sum(),mean(), max() on MultiIndex
用ironmanNumber來取得每年參加的組數平均
ironmanNumber.mean(level='year')
# 輸出結果
subject azure ai&data web
type 自我挑戰組 主題競賽 自我挑戰組 主題競賽 自我挑戰組 主題競賽
year
2017 23.5 15.0 10.0 20.0 19.0 3.0
2016 43.5 20.5 27.0 28.5 30.0 30.5
2018 17.5 13.5 36.5 19.0 26.0 8.0